#pragma once

#include "../dep/include/openssl/md5.h"
#include "BigNumber.h"

namespace Crypt {

class MD5
{
private:
	MD5_CTX mCtx;
	uint8 mDigest[MD5_DIGEST_LENGTH];
	bool mIsFinal;
public:
	MD5();
	void getDigest(uint8 (&buffer)[MD5_DIGEST_LENGTH]);
	// Function is NOT const, MD5_Final is called
	const uint8* getDigest();

	template<typename T>
	void update(const T& value) {
		update(&data, sizeof(T));
	}

	template<>
	void update<std::string>(const std::string& value) {
		update(value.c_str(), value.size());
	}

	template<>
	void update<BigNumber>(const BigNumber& value) {
		update(value.AsByteArray(), value.GetNumBytes());
	}

	void update(const char* value) {
		update(value, strlen(value));
	}

	void update(const void* data, uint32 numBytes);
};

};